{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.7.1"
    },
    "colab": {
      "name": "Sparse.ipynb",
      "provenance": [],
      "collapsed_sections": [],
      "include_colab_link": true
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/harvardnlp/pytorch-struct/blob/master/notebooks/Sparse.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "52o7RbQfER57",
        "colab_type": "text"
      },
      "source": [
        "# Banded Sparse Matrices for PyTorch \n",
        "\n",
        "Working in deep learning for NLP a common statement I often hear from students is that \"dense operations are fast / sparse are slow\". With the exception of convolutions most of the operations we do in NLP, roughly take the form of dense matrix-matrix (i.e. attention) or matrix-vector multiplies (i.e. RNN, output embeddings). \n",
        "\n",
        "Part of this though is just that these are the operations people have taken the time to optimize on CUDA and come built into libraries. There are a lot of sparse matrix strategies that run really fast on GPU. \n",
        "\n",
        "In this notebook I show the implementation of one class of sparse matrix: https://en.wikipedia.org/wiki/Band_matrix"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Znwj4B1mELhh",
        "colab_type": "code",
        "outputId": "195cc0da-8cc7-4f9c-ff3e-7f4e30201bae",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 33
        }
      },
      "source": [
        "import torch\n",
        "import matplotlib.pyplot as plt\n",
        "!pip install -qU git+https://github.com/harvardnlp/genbmm\n",
        "import genbmm"
      ],
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "  Building wheel for genbmm (setup.py) ... \u001b[?25l\u001b[?25hdone\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "3Zmx2mcRHyrU",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "def show(bm):\n",
        "    bm = bm\n",
        "    plt.tight_layout()\n",
        "    fig = plt.figure()\n",
        "    fig.set_figheight(5)\n",
        "    fig.set_figwidth(5) \n",
        "    a = fig.add_subplot(1,2,2)\n",
        "    plt.imshow(bm.to_dense().cpu().detach()[0], vmin=0, vmax=1)\n",
        "    plt.axis('off')\n",
        "\n",
        "    fig.set_figheight(5)\n",
        "    fig.set_figwidth(10) \n",
        "    a = fig.add_subplot(1,2,1)\n",
        "    plt.imshow(bm.data.cpu().detach()[0], vmin=0, vmax=1)\n",
        "    plt.axis('off')"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "c2r4NmPCKLed",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "base = torch.arange(1, 21).view(1, 20, 1).expand(1, 20, 4).cuda() / 21.0\n",
        "bm = genbmm.BandedMatrix(base, 2, 1)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "JN_CVVSqH2v1",
        "colab_type": "code",
        "outputId": "8b47f5c1-5362-41fa-b85b-46a55a2aed12",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 318
        }
      },
      "source": [
        "show(bm)"
      ],
      "execution_count": 35,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 0 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nSUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 720x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "7FNbxFCjKTbB",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 318
        },
        "outputId": "5546f369-bc0a-4cef-96b1-e459a7383e95"
      },
      "source": [
        "show(bm.transpose())"
      ],
      "execution_count": 36,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 0 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 720x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "X_mbAbS4Rf1_",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 318
        },
        "outputId": "86038342-40ac-424c-a3c8-03d2b7529211"
      },
      "source": [
        "show(bm.op(bm, lambda a,b : (a + b) / 2))"
      ],
      "execution_count": 40,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 0 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nSUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 720x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "R8k0K1VyRrZr",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 318
        },
        "outputId": "93c93562-ff88-457f-c9ba-e0f6629ca8d5"
      },
      "source": [
        "show(bm.op(bm.transpose(), lambda a,b : (a + b) / 2))"
      ],
      "execution_count": 41,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 0 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nAElFTkSuQmCC\n",
            "text/plain": [
              "<Figure size 720x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "B4GufAQSRwFj",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 318
        },
        "outputId": "2b8e1da7-ed0e-4565-fcc3-99b18399e8d8"
      },
      "source": [
        "show(bm.multiply(bm))"
      ],
      "execution_count": 42,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 0 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\njZQAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 720x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "YMCDP9xsSANh",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 318
        },
        "outputId": "73c04912-13a2-4695-c9c6-b0380ef3701e"
      },
      "source": [
        "show(bm.band_shift(1))"
      ],
      "execution_count": 47,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 0 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 720x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "JF6XeD-pSHpB",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 318
        },
        "outputId": "c361b7e8-e66a-417f-cae5-b3ff7aa5adfe"
      },
      "source": [
        "show(bm.band_shift(-1))"
      ],
      "execution_count": 48,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 0 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 720x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "xgplTEHISJ7x",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 318
        },
        "outputId": "157a807a-3e00-412c-d36d-e4bcf6668a6b"
      },
      "source": [
        "show(bm.col_shift(1))"
      ],
      "execution_count": 50,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 0 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nSUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 720x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "3A0ojA3fSNWS",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 318
        },
        "outputId": "d80bc878-58a5-496f-bc3f-9e6adee0258e"
      },
      "source": [
        "show(bm.col_shift(-1))"
      ],
      "execution_count": 51,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 0 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nQmCC\n",
            "text/plain": [
              "<Figure size 720x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "94TqiXOiR1Iw",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 318
        },
        "outputId": "a6fa5341-f462-4175-a22a-314bcc5a3e5f"
      },
      "source": [
        "show(bm.multiply(bm.transpose()).multiply(bm.transpose()).multiply(bm.transpose()))"
      ],
      "execution_count": 57,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 0 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nIEJUAAAR/wTd93J+WZCo+wAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "<Figure size 720x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "LGBfpC9lSTz4",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 318
        },
        "outputId": "a50bd490-309f-4b93-b9d0-b73b8003a97d"
      },
      "source": [
        "show(bm.multiply(bm.band_shift(1).band_shift(1)))"
      ],
      "execution_count": 55,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 0 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 720x360 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "yu7j14_dS0uW",
        "colab_type": "text"
      },
      "source": [
        "There are a lot of fun applications of this style of banded matrix. In my library PyTorch-Struct we use them for very fast computation of sequence alignnments."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "S27rNtfcTM69",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "!pip install -qU git+https://github.com/harvardnlp/pytorch-struct"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "oZMo__Q1Tplm",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 285
        },
        "outputId": "7e50e66e-e1da-4f4e-d095-711ec540234d"
      },
      "source": [
        "import torch_struct\n",
        "vals = torch.rand(1, 200, 200, 3).cuda()\n",
        "vals[0, 180:, :] = 1e6\n",
        "vals[0, :, 180:] = 1e6\n",
        "q = torch_struct.Alignment(torch_struct.LogSemiring).marginals(vals.cuda())\n",
        "plt.imshow(q[0].cpu().detach()[...].sum(-1), vmin=0, vmax=1.0)"
      ],
      "execution_count": 94,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.image.AxesImage at 0x7fe0ceb369e8>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 94
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nRU5ErkJggg==\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    }
  ]
}